#include <stdio.h>

// wezly
#define MAX_NODES_NR 100 // maksymalna ilosc wezlow
#define new(type) (type *)calloc(sizeof(type), 1)
struct Info { // struktura elementu (dane osoby)
  int in;
  int next_time;
  int out;
};
typedef struct Info info; // typ danych item (element)
typedef struct Node *link; // typ danych dowiazanie
struct Node { // trzyczesciowa struktura wezla
  info item;
  link prev;
  link next;
};	
typedef struct Node node; // typ danych wezel
int nodes_nr; // liczba wezlow
node nodes_tab[MAX_NODES_NR]; // tablica wezlow rozmiaru NodesNr
int read_data(char * ); // importowanie danych z pliku

// lista dwukierunkowa
link dummy_link; // dowiazanie do atrapy
void dummy_ins(); // wstawienie atrapy
void node_ins(node ); // wstawienie wezla do listy
void print(link t);

int main() 
{
  int i;
  link t;
  nodes_nr = read_data("data.in");
  dummy_ins(); // wstawienie atrapy
  for (i = 0; i < nodes_nr; i++) // wlozenie wezlow do listy dwukierunkowej
    node_ins(nodes_tab[i]);
  for (t = dummy_link->next; t->item.next_time != 0; t = t->next) // wydruk
    print(t);
  return 0;
}

// funkcje wezlow
int read_data(char *FileName) 
{
  FILE *fp;
  fp = fopen(FileName, "r");  
  char *fmt = "%i %i %i"; // format danych pliku wejsciowego 
  int in;
  int next_time;
  int out;
  info x; // element 
  int count = 0; // licznik
  while ((fscanf(fp, fmt, &in, &next_time, &out)) != EOF) {  
    x.in = in;
    x.next_time = next_time;
    x.out = out;
    nodes_tab[count].item = x;
    count++;
  }
  fclose(fp);  
  return count;
}

// funkcje listy dwukierunkowej
void dummy_ins() 
{
  info dummy; // atrapa
  dummy.in = 0;
  dummy.next_time = 0;
  dummy.out = 0; 
  dummy_link = new(node);
  dummy_link->item = dummy;
  dummy_link->next = dummy_link;
  dummy_link->prev = dummy_link;
}

void node_ins(node a) 
{
  link t, u;
  t = new(node);
  if (dummy_link->prev == dummy_link) {
  t->item = a.item;
  t->prev = dummy_link;
  t->next = dummy_link;
  dummy_link->prev = t;
  dummy_link->next = t;
  }
    else {
    t->item = a.item;
    u = dummy_link->prev;
    u->next = t;
    dummy_link->prev = t;
    t->prev = u;
    t->next = dummy_link;
    }
}

void print(link t)
{
  printf("%i\t%i\t%i\n", t->item.in, t->item.next_time, t->item.out); 
}
